package com.demarc.pesquisas.web.relatorio;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;

import com.demarc.pesquisas.infraestrutura.web.jsf.JsfUtil;
import com.demarc.pesquisas.negocio.dto.DetalheEntrevistaDTO;
import com.demarc.pesquisas.negocio.dto.RelatorioAgrupamentoLocalidadeDTO;
import com.demarc.pesquisas.negocio.dto.RelatorioFiltroDTO;
import com.demarc.pesquisas.negocio.entidade.pesquisa.Pesquisa;
import com.demarc.pesquisas.negocio.service.entrevista.IEntrevistaService;
import com.demarc.pesquisas.negocio.service.pesquisa.IPesquisaService;
import com.demarc.pesquisas.web.pagina.ConstantesPaginas;

@ManagedBean
@SessionScoped
public class RelatorioPesquisaFamiliarInajaMB implements Serializable {

    private static final Logger LOGGER = Logger.getLogger(RelatorioPesquisaFamiliarInajaMB.class);

    @ManagedProperty(value = "#{entrevistaService}")
    private IEntrevistaService entrevistaService;

    @ManagedProperty(value = "#{pesquisaService}")
    private IPesquisaService pesquisaService;

    private Pesquisa pesquisa;
    private RelatorioFiltroDTO filtro;

    private List<String> localidades;

    public String abrirPagina() {
        inicializarPagina();
        return JsfUtil.avancarParaPagina(ConstantesPaginas.RELATORIO_PESQUISA_FAMILIAR_INAJA);
    }

    private void inicializarPagina() {
        // FIXME atg - Se houverem mais pesquisas, fazer consulta para o menu dinâmico e ao clicar na pesquisa setar o id da mesma.
        this.pesquisa =
                !pesquisaService.listarOrdenadoPor().isEmpty() ? pesquisaService
                        .listarOrdenadoPor().get(0) : null;
        this.localidades = entrevistaService.listarLocalidades(this.pesquisa);
        this.filtro = new RelatorioFiltroDTO(this.pesquisa.getId());
    }

    public void gerarRelatorioDetalhes() {

        List<DetalheEntrevistaDTO> dataSource =
                entrevistaService.consultarRelatorioDetalhes(filtro);

        RelatorioDetalheEntrevistaPesquisaFamiliarInaja relatorio =
                new RelatorioDetalheEntrevistaPesquisaFamiliarInaja(TipoRelatorioEnum.GERAL,
                        this.filtro.getLocalidade(), dataSource);

        String reportPath =
                FacesContext.getCurrentInstance().getExternalContext()
                        .getRealPath(relatorio.getJasperFileLocation());

        LOGGER.info(reportPath);
        relatorio.generateReportPDF(reportPath);
    }

    public void gerarRelatorioTotalizador() {

        List<RelatorioAgrupamentoLocalidadeDTO> dataSource =
                entrevistaService.consultarRelatorioTotalizador(this.filtro);

        RelatorioTotalizadorPesquisaFamiliarInaja relatorioTotalizador =
                new RelatorioTotalizadorPesquisaFamiliarInaja(this.filtro.getLocalidade(),
                        dataSource);

        String reportPath =
                FacesContext.getCurrentInstance().getExternalContext()
                        .getRealPath(relatorioTotalizador.getJasperFileLocation());

        LOGGER.info(reportPath);
        relatorioTotalizador.generateReportPDF(reportPath);
    }

    public void limpar() {
        this.inicializarPagina();
    }

    // Gets and Sets

    public Pesquisa getPesquisa() {
        return pesquisa;
    }

    public void setPesquisa(Pesquisa pesquisa) {
        this.pesquisa = pesquisa;
    }

    public RelatorioFiltroDTO getFiltro() {
        return filtro;
    }

    public void setFiltro(RelatorioFiltroDTO filtro) {
        this.filtro = filtro;
    }

    public List<String> getLocalidades() {
        return localidades;
    }

    public void setLocalidades(List<String> localidades) {
        this.localidades = localidades;
    }

    public IPesquisaService getPesquisaService() {
        return pesquisaService;
    }

    public void setPesquisaService(IPesquisaService pesquisaService) {
        this.pesquisaService = pesquisaService;
    }

    public IEntrevistaService getEntrevistaService() {
        return entrevistaService;
    }

    public void setEntrevistaService(IEntrevistaService entrevistaService) {
        this.entrevistaService = entrevistaService;
    }
}
